//
//  main.m
//  07-内存管理
//
//  Created by dllo on 16/7/12.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Man.h"
#import "Woman.h"
int main(int argc, const char * argv[]) {
    
    //内存问题
    // 一.内存溢出
    //     内存过多导致溢出，产生Crash
    // 二.野指针 （过度释放）
    //    指针指向未知区域，指向一块被释放的内存
    
    // 内存管理方式
    // 1.垃圾回收机制 ：只有Mac 上有  Jave 常用
    // iOS
    // 2.MRC:手动管理引用计数
     //3.ARC:自动管理引用计数 （现在常用）
    // 注意：ARC基于MRC进行管理。系统帮 程序员添加了内存管理
    
    //遇到retain alloc copy需要进行内存管理
    //1.MRC
    //内存管理机制：引用计数（计数器）
    //  有retain alloc  copy 会对引用计数 ＋1
    // 有 release  autorelease 会对引用计数 —1
    // 当对象的计数器为0 的时候，系统会调用相应的dealloc方法
    
    
    // 注意：内存管理，你对对象操作完成后，在进行释放
    Man *man = [[Man alloc]init];
    NSLog(@"%ld",man.retainCount);
    [man retain];
    [man release];
    NSLog(@" %@  %ld",man,man.retainCount);
    
    // 集合类型， 会对对象进行引用计数
    // addObect 对 对象进行引用计数 ＋1
    // removeObject 对 对象引用计数 －1
    NSMutableArray *marr = [NSMutableArray arrayWithObjects:man, nil];
    NSLog(@"向数组中添加的引用计数：%ld",man.retainCount);
    [marr removeAllObjects];
    NSLog(@"从数组中溢出引用计数：%ld",man.retainCount);
    
    //2.ARC
    // strong (强引用，引用计数 ＋ 1)  weak （应用于对象类型（NSObject子类，弱引用，对象被释放时 ，会自动置空）
    // retain (MRC ,强引用，引用计数 ＋ 1)
    // copy  (拷贝，把对象拷贝一份，原来的引用计数不变，新的＋1)
    // assgin (应用于简单的数据类型，不会产生引用计数)
   
    
    /** 协议
     1.声明协议，声明协议方法
     2.签订协议
     3.实现协议方法
     */
    
    //如果想实现对象的拷贝
    //1.签订协议 NSCopying
    //2.实现协议方法copyWithZone
    
    
    
   Man *newMan = [man copy];
    NSLog(@"%@  %@",newMan.name,newMan.age);
    newMan.name = @"d";
    newMan.age = @"12";
    id name = [newMan valueForKey:@"name"];
    NSLog(@"%@",name);
    [newMan setValue:@"a" forKey:@"name"];
    NSLog(@"%@",newMan.name);
    
    Man *gayMan = [[Man alloc]init];
    gayMan.gayMan = newMan;
    id boyName = [gayMan valueForKeyPath:@"gayMan.name"];
    NSLog(@"++++++%@",boyName);
    [gayMan release];
    [gayMan setValue:@"lsisi" forKeyPath:@"gayMan.name"];
    NSLog(@"%@",gayMan.gayMan.name);
    
    
   NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
    [mdic setValue:@"zhangsan" forKey:@"name"];
    NSLog(@"%@",mdic);
    
    
    
    
    
    
    return 0;
}
